package com.samuel.learing.controller.javaBase;


import java.util.ArrayList;
import java.util.List;

/**
 *
 * @see{
 *
 *    值传递 / 引用传递
 *    基本类型数据是值传递，存在变量中，
 *    引用类型是引用传递，集合属于引用类型，引用类型是吧对象的地址存在变量中
 *
 *    理解下 引用传递的内存分配图
 *
 *    引用的话，是替换新的引用地址，原来的对象不会变，只是没有被引用的对象就是垃圾，不久就会被回收
 * }
 * @company: mamahao.com
 * @author: taozhaoyang
 * @time: 2017-12-05 19:59
 * @version: 1.0
 * @desc: 传参看，参数是否会变化
 *
 *
 **/
public class TransferParamsController {

    public static void main(String[] args) {


        /**
         * 1.
         * 打印a 在原方法中是不变的，即使在子方法中值变了
         *  a=3
         * 我把a++了，a=4
         * a=3
         *
         */
        int a=3;

        System.out.println("a="+a);
        doSomething(a);
        System.out.println("a="+a);


        /**
         *
         * 2.
         *  下面传参是 集合，打印如下
         *  方法1打印------------start
             Disconnected from the target VM, address: '127.0.0.1:51767', transport: 'socket'
             1
             2
             方法1打印------------end
             子方法打印------------start
             1
             2
             1
             2
             子方法打印------------end
             方法2打印------------start
             1
             2
             1
             2
             方法2打印------------end

          可以看出，传参为集合时，在子方法中对参数-集合的操作，在主方法中仍然生效
         *
         *
         *
         */

        List<Integer> list = new ArrayList<Integer>();
        list.add(1);
        list.add(2);
        System.out.println("方法1打印------------start");
        list.stream().forEach(System.out::println);
        System.out.println("方法1打印------------end");
        doSomething2(list);
        System.out.println("方法2打印------------start");
        list.stream().forEach(System.out::println);
        System.out.println("方法2打印------------end");


        /**
         * 3. 总结
         *
         *  a 的传参，主方法中值不变，而集合list确实变了，为什么？
         *
         *  1.a是值传递，传递的是主方法中a的拷贝值，或者叫副本值
         *  2.list 是引用传递，传递的是一个引用，指向对象 的存放地址
         *
         */
    }


    private static void doSomething(int  a){
        a++;
        System.out.println("我把a++了，a="+a);
    }

    private static void doSomething2(List<Integer>  list){
        list.add(1);
        list.add(2);
        System.out.println("子方法打印------------start");
        list.stream().forEach(System.out::println);
        System.out.println("子方法打印------------end");
    }
}